home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 17 / AMIGAplus Sonderheft 17 (1999)(ICP)(DE)[!].iso / PD / Anwendungen / ToolManager / Source / Library / toolmanager.h < prev    next >
C/C++ Source or Header  |  1998-06-17  |  18KB  |  477 lines

  1. /*
  2.  * toolmanager.h  V3.1
  3.  *
  4.  * Library main include file
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. /* OS include files */
  17. #include <datatypes/datatypes.h>
  18. #include <datatypes/pictureclass.h>
  19. #include <datatypes/pictureclassext.h>
  20. #include <dos/dos.h>
  21. #include <dos/dostags.h>
  22. #include <exec/libraries.h>
  23. #include <exec/memory.h>
  24. #include <exec/resident.h>
  25. #include <hardware/blit.h>
  26. #include <intuition/gadgetclass.h>
  27. #include <intuition/imageclass.h>
  28. #include <intuition/intuitionbase.h>
  29. #include <libraries/dospath.h>
  30. #include <libraries/gadtools.h>
  31. #include <libraries/iffparse.h>
  32. #include <libraries/locale.h>
  33. #include <libraries/screennotify.h>
  34. #include <libraries/toolmanager.h>
  35. #include <libraries/wbstart.h>
  36. #include <rexx/errors.h>
  37. #include <workbench/startup.h>
  38.  
  39. /* Do some redefines to enable DICE register parameters */
  40. #define CoerceMethodA  DummyCMA
  41. #define DoMethodA      DummyDMA
  42. #define DoSuperMethodA DummyDSMA
  43. #include <clib/alib_protos.h>
  44. #undef CoerceMethodA
  45. #undef DoMethodA
  46. #undef DoSuperMethodA
  47. #if 1
  48. /* Define these functions with DICE regargs */
  49. ULONG CoerceMethodA(__A0 Class *, __A2 Object *, __A1 Msg);
  50. ULONG DoSuperMethodA(__A0 Class *, __A2 Object *, __A1 Msg);
  51. ULONG DoMethodA(__A2 Object *, __A1 Msg);
  52. #else
  53. __stkargs ULONG CoerceMethodA(Class *, Object *, Msg);
  54. __stkargs ULONG DoSuperMethodA(Class *, Object *, Msg);
  55. __stkargs ULONG DoMethodA(Object *, Msg);
  56. #endif
  57.  
  58. /* OS function prototypes */
  59. #include <clib/commodities_protos.h>
  60. #include <clib/datatypes_protos.h>
  61. #include <clib/diskfont_protos.h>
  62. #include <clib/dos_protos.h>
  63. #include <clib/dospath_protos.h>
  64. #include <clib/exec_protos.h>
  65. #include <clib/gadtools_protos.h>
  66. #include <clib/graphics_protos.h>
  67. #include <clib/icon_protos.h>
  68. #include <clib/iffparse_protos.h>
  69. #include <clib/intuition_protos.h>
  70. #include <clib/locale_protos.h>
  71. #include <clib/rexxsyslib_protos.h>
  72. #include <clib/screennotify_protos.h>
  73. #include <clib/utility_protos.h>
  74. #include <clib/wb_protos.h>
  75. #include <clib/wbstart_protos.h>
  76.  
  77. /* OS function inline calls */
  78. #include <pragmas/commodities_pragmas.h>
  79. #include <pragmas/datatypes_pragmas.h>
  80. #include <pragmas/diskfont_pragmas.h>
  81. #include <pragmas/dos_pragmas.h>
  82. #include <pragmas/dospath_pragmas.h>
  83. #include <pragmas/exec_pragmas.h>
  84. #include <pragmas/gadtools_pragmas.h>
  85. #include <pragmas/graphics_pragmas.h>
  86. #include <pragmas/icon_pragmas.h>
  87. #include <pragmas/iffparse_pragmas.h>
  88. #include <pragmas/intuition_pragmas.h>
  89. #include <pragmas/locale_pragmas.h>
  90. #include <pragmas/rexxsyslib_pragmas.h>
  91. #include <pragmas/screennotify_pragmas.h>
  92. #include <pragmas/utility_pragmas.h>
  93. #include <pragmas/wb_pragmas.h>
  94. #include <pragmas/wbstart_pragmas.h>
  95.  
  96. /* ANSI C include files */
  97. #include <stdlib.h>
  98. #include <string.h>
  99.  
  100. /* Localization */
  101. #define CATCOMP_NUMBERS
  102. #define CATCOMP_STRINGS
  103. #include "/locale/toolmanager.h"
  104.  
  105. /* Debugging */
  106. #ifdef DEBUG
  107. /* Global data */
  108. #define DEBUGFLAGENTRIES  1
  109. #define DEBUGPRINTTAGLIST
  110.  
  111. /* Macros */                                   /* 87654321 */
  112. #define INTERFACE_LOG(x)   _LOG(0,  0, (x))    /*        1 */
  113. #define MEMORY_LOG(x)      _LOG(0,  1, (x))    /*        2 */
  114. #define HANDLER_LOG(x)     _LOG(0,  2, (x))    /*        4 */
  115. #define TMHANDLE_LOG(x)    _LOG(0,  3, (x))    /*        8 */
  116. #define COMMANDS_LOG(x)    _LOG(0,  4, (x))    /*       10 */
  117. #define BASECLASS_LOG(x)   _LOG(0,  5, (x))    /*       20 */
  118. #define EXECCLASS_LOG(x)   _LOG(0,  6, (x))    /*       40 */
  119. #define IMAGECLASS_LOG(x)  _LOG(0,  7, (x))    /*       80 */
  120. #define SOUNDCLASS_LOG(x)  _LOG(0,  8, (x))    /*      100 */
  121. #define MENUCLASS_LOG(x)   _LOG(0,  9, (x))    /*      200 */
  122. #define ICONCLASS_LOG(x)   _LOG(0, 10, (x))    /*      400 */
  123. #define DOCKCLASS_LOG(x)   _LOG(0, 11, (x))    /*      800 */
  124. #define CONFIG_LOG(x)      _LOG(0, 12, (x))    /*     1000 */
  125. #define GLOBAL_LOG(x)      _LOG(0, 13, (x))    /*     2000 */
  126. #define IDCMP_LOG(x)       _LOG(0, 14, (x))    /*     4000 */
  127. #define COMMODITIES_LOG(x) _LOG(0, 15, (x))    /*     8000 */
  128. #define APPMSGS_LOG(x)     _LOG(0, 16, (x))    /*    10000 */
  129. #define NETWORK_LOG(x)     _LOG(0, 17, (x))    /*    20000 */
  130. #define SCREEN_LOG(x)      _LOG(0, 18, (x))    /*    40000 */
  131. #define CLISTART_LOG(x)    _LOG(0, 19, (x))    /*    80000 */
  132. #define WBSTART_LOG(x)     _LOG(0, 20, (x))    /*   100000 */
  133. #define AREXX_LOG(x)       _LOG(0, 21, (x))    /*   200000 */
  134. #define CMDLINE_LOG(x)     _LOG(0, 22, (x))    /*   400000 */
  135. #define GROUPCLASS_LOG(x)  _LOG(0, 23, (x))    /*   800000 */
  136. #define BUTTONCLASS_LOG(x) _LOG(0, 24, (x))    /*  1000000 */
  137. #define ENTRYCLASS_LOG(x)  _LOG(0, 25, (x))    /*  2000000 */
  138. #define LOCALE_LOG(x)      _LOG(0, 26, (x))    /*  4000000 */
  139. #else
  140. #define INTERFACE_LOG(x)
  141. #define MEMORY_LOG(x)
  142. #define HANDLER_LOG(x)
  143. #define TMHANDLE_LOG(x)
  144. #define COMMANDS_LOG(x)
  145. #define BASECLASS_LOG(x)
  146. #define EXECCLASS_LOG(x)
  147. #define IMAGECLASS_LOG(x)
  148. #define SOUNDCLASS_LOG(x)
  149. #define MENUCLASS_LOG(x)
  150. #define ICONCLASS_LOG(x)
  151. #define DOCKCLASS_LOG(x)
  152. #define CONFIG_LOG(x)
  153. #define GLOBAL_LOG(x)
  154. #define IDCMP_LOG(x)
  155. #define COMMODITIES_LOG(x)
  156. #define APPMSGS_LOG(x)
  157. #define NETWORK_LOG(x)
  158. #define SCREEN_LOG(x)
  159. #define CLISTART_LOG(x)
  160. #define WBSTART_LOG(x)
  161. #define AREXX_LOG(x)
  162. #define CMDLINE_LOG(x)
  163. #define GROUPCLASS_LOG(x)
  164. #define BUTTONCLASS_LOG(x)
  165. #define ENTRYCLASS_LOG(x)
  166. #define LOCALE_LOG(x)
  167. #endif
  168.  
  169. /* Globale ToolManager definitions */
  170. #include "/global.h"
  171.  
  172. /* Revision number */
  173. #define TMLIBREVISION 12
  174.  
  175. /* Library <-> Handler IPC commands */
  176. #define TMIPC_AllocTMHandle  0
  177. #define TMIPC_FreeTMHandle   1
  178. #define TMIPC_CreateTMObject 2
  179. #define TMIPC_DeleteTMObject 3
  180. #define TMIPC_ChangeTMObject 4
  181.  
  182. /* Handler states */
  183. #define TMHANDLER_INACTIVE 0  /* Handler not running.  Set by handler */
  184. #define TMHANDLER_STARTING 1  /* Handler starting.     Set by library */
  185. #define TMHANDLER_RUNNING  2  /* Handler is active.    Set by handler */
  186. #define TMHANDLER_CLOSING  3  /* Handler should leave. Set by library */
  187. #define TMHANDLER_LEAVING  4  /* Handler is leaving.   Set by library */
  188.  
  189. /* Library base */
  190. struct ToolManagerBase {
  191.  struct Library  tmb_Library;
  192.  UWORD           tmb_State;
  193.  BPTR            tmb_Segment;
  194.  struct Process *tmb_Process;
  195.  struct MsgPort *tmb_Port;
  196. };
  197.  
  198. /* Global data */
  199. extern struct Library         *DOSBase;
  200. extern struct Library         *GfxBase;
  201. extern struct Library         *IFFParseBase;
  202. extern struct Library         *IntuitionBase;
  203. extern struct Library         *SysBase;
  204. extern struct Library         *UtilityBase;
  205. extern struct ToolManagerBase *ToolManagerBase;
  206. extern const Class            *ToolManagerClasses[TMOBJTYPES];
  207. extern const Class            *ToolManagerGroupClass;
  208. extern const Class            *ToolManagerButtonClass;
  209. extern const Class            *ToolManagerEntryClass;
  210. extern const char              DefaultOutput[];
  211. extern const char              DefaultDirectory[];
  212. extern const char              DosName[];
  213. extern const char              ToolManagerName[];
  214.  
  215. /* Data structures */
  216. struct TMMessage {
  217.  struct Message  tmm_Msg;     /* Library <-> Handler IPC */
  218.  UBYTE           tmm_Command; /* Library <-> Handler IPC */
  219.  UBYTE           tmm_Type;    /* Object type             */
  220.  char           *tmm_Object;  /* Object name             */
  221.  struct TagItem *tmm_Tags;    /* Object parameters       */
  222. };
  223.  
  224. struct TMHandle {
  225.  struct TMMessage tmh_Message;
  226.  struct MinNode   tmh_Node;                    /* Node for handle list    */
  227.  ULONG            tmh_IDCounter;               /* Counter for IDs         */
  228.  struct MinList   tmh_ObjectLists[TMOBJTYPES]; /* Object lists            */
  229. };
  230. #define TMHANDLE(n) ((struct TMHandle *) \
  231.                       ((char *) (n) - sizeof(struct TMMessage)))
  232.  
  233. struct TMMemberData {
  234.  struct MinNode  tmmd_Node;   /* For member list management       */
  235.  Object         *tmmd_Object; /* Object of which we are member of */
  236.  Object         *tmmd_Member; /* The member itself                */
  237. };
  238.  
  239. struct TMImageData {
  240.  struct TMMemberData  tmid_MemberData; /* This is a derived structure       */
  241.  ULONG                tmid_Type;       /* Imaga data type                   */
  242.  void                *tmid_ImageData;  /* Image data (DiskObject or BitMap) */
  243.  UWORD                tmid_Width;      /* Image width in pixels             */
  244.  UWORD                tmid_Height;     /* Image height in pixels            */
  245. };
  246.  
  247. /* Prototypes of library internal functions */
  248. void            KillToolManager(void);
  249. void            ToolManagerHandler(void);
  250. void            InitHandles(void);
  251. struct MinList *GetHandleList(void);
  252. BOOL            InitToolManagerHandle(struct TMHandle *);
  253. void            DeleteToolManagerHandle(struct TMHandle *);
  254. Object         *CreateToolManagerObject(struct TMHandle *, ULONG);
  255. Object         *FindTypedNamedTMObject(struct TMHandle *, const char *, ULONG);
  256. Object         *FindNamedTMObject(struct TMHandle *, const char *);
  257. Object         *FindTypedIDTMObject(struct TMHandle *, ULONG, ULONG);
  258. LONG            StartConfigChangeNotify(void);
  259. void            StopConfigChangeNotify(void);
  260. BOOL            HandleConfigChange(void);
  261. BOOL            NextConfigParseStep(struct TMHandle *);
  262. void           *DuplicateProperty(struct IFFHandle *, ULONG, ULONG);
  263. BOOL            ParseGlobalIFF(struct IFFHandle *);
  264. void            FreeGlobalParameters(void);
  265. char           *GetGlobalDefaultDirectory(void);
  266. void            StartPreferences(void);
  267. LONG            StartLowMemoryWarning(void);
  268. void            StopLowMemoryWarning(void);
  269. void            HandleLowMemory(void);
  270. LONG            StartIDCMP(void);
  271. void            StopIDCMP(void);
  272. void            HandleIDCMP(void);
  273. BOOL            AttachIDCMP(Object *, struct Window *, ULONG);
  274. void            SafeCloseWindow(struct Window *);
  275. LONG            StartCommodities(void);
  276. void            StopCommodities(void);
  277. void            HandleCommodities(void);
  278. CxObj          *CreateHotKey(const char *, Object *);
  279. void            SafeDeleteCxObjAll(struct CxObj *, Object *);
  280. BOOL            SendInputEvent(const char *);
  281. LONG            StartAppMessages(void);
  282. void            StopAppMessages(void);
  283. void            HandleAppMessages(void);
  284. void           *CreateAppMenuItem(Object *);
  285. void            DeleteAppMenuItem(void *, Object *);
  286. void           *CreateAppIcon(Object *, struct DiskObject *, BOOL);
  287. void            DeleteAppIcon(void *, Object *);
  288. void           *CreateAppWindow(Object *, struct Window *);
  289. void            DeleteAppWindow(void *, Object *);
  290. LONG            StartNetwork(void);
  291. void            StopNetwork(void);
  292. void            EnableNetwork(void);
  293. void            DisableNetwork(void);
  294. void            HandleNetwork(void);
  295. LONG            StartScreenNotify(void);
  296. void            StopScreenNotify(void);
  297. void            LockScreenNotify(void);
  298. void            ReleaseScreenNotify(void);
  299. void            HandleScreenNotify(void);
  300. LONG            StartIPC(void);
  301. void            StopIPC(void);
  302. struct MsgPort *GetIPCPort(void);
  303. void            HandleIPC(void);
  304. Class          *CreateBaseClass(void);
  305. Class          *CreateExecClass(Class *);
  306. Class          *CreateImageClass(Class *);
  307. void            EnableRemap(BOOL, ULONG);
  308. Class          *CreateSoundClass(Class *);
  309. Class          *CreateMenuClass(Class *);
  310. Class          *CreateIconClass(Class *);
  311. Class          *CreateDockClass(Class *);
  312. Class          *CreateGroupClass(void);
  313. Class          *CreateButtonClass(void);
  314. Class          *CreateEntryClass(void);
  315. BOOL            StartCLIProgram(const char *, const char *, const char **,
  316.                                 const char *, ULONG, WORD,
  317.                                 struct AppMessage *);
  318. BOOL            GetWorkbenchPath(void);
  319. void            FreeWorkbenchPath(void);
  320. BOOL            StartWBProgram(const char *, const char *, ULONG, WORD,
  321.                                struct AppMessage *);
  322. BOOL            SendARexxCommand(const char *, ULONG);
  323. BOOL            StartARexxProgram(const char *, const char *,
  324.                                   struct AppMessage *);
  325. char           *BuildCommandLine(const char *, struct AppMessage *, BPTR,
  326.                                  ULONG *);
  327. void            SafeDeleteMsgPort(struct MsgPort *);
  328. void            StartLocale(void);
  329. void            StopLocale(void);
  330. const char     *TranslateString(const char *, ULONG);
  331.  
  332. /* ToolManager class Methods */
  333. #define TMM_Methods                                          (0x80000000)
  334.      /* Method name                                          Method ID       */
  335.      /*                Method params    Return type                          */
  336.  
  337.      /* All classes                                                          */
  338. #define TMM_Attach                                           (TMM_Methods +  1)
  339.      /*                 TMP_Attach      (struct TMMemberData *)              */
  340. #define TMM_Detach                                           (TMM_Methods +  2)
  341.      /*                 TMP_Detach      (void)                               */
  342.  
  343.      /* Classes derived from Base class */
  344. #define TMM_Release                                          (TMM_Methods +  3)
  345.      /*                 TMP_Detach      (void)                               */
  346. #define TMM_ParseIFF                                         (TMM_Methods +  4)
  347.      /*                 TMP_ParseIFF    (BOOL)                               */
  348. #define TMM_ParseTags                                        (TMM_Methods +  5)
  349.      /*                 TMP_ParseTags   (BOOL)                               */
  350.  
  351.      /* Exec, Sound, Menu, Icon, Dock classes */
  352. #define TMM_Activate                                         (TMM_Methods +  6)
  353.      /*                 TMP_Activate    (void)                               */
  354.  
  355.      /* Icon, Entry classes */
  356. #define TMM_Notify                                           (TMM_Methods +  7)
  357.      /*                 TMP_Detach      (void)                               */
  358.  
  359.      /* Image class */
  360. #define TMM_GetImage                                         (TMM_Methods +  8)
  361.      /*                 TMP_GetImage    (struct TMImageData *)               */
  362. #define TMM_PurgeCache                                       (TMM_Methods +  9)
  363.      /*                 Msg             (void)                               */
  364.  
  365.      /* Dock class */
  366. #define TMM_IDCMPEvent                                       (TMM_Methods + 10)
  367.      /*                 TMP_IDCMPEvent  (void)                               */
  368. #define TMM_ScreenOpen                                       (TMM_Methods + 11)
  369.      /*                 TMP_ScreenOpen  (void)                               */
  370.  
  371.      /* Image and Dock classes */
  372. #define TMM_ScreenClose                                      (TMM_Methods + 12)
  373.      /*                 TMP_ScreenClose (void)                               */
  374.  
  375.      /* Group class */
  376. #define TMM_Layout                                           (TMM_Methods + 13)
  377.      /*                 TMP_Layout      (void)                               */
  378. #define TMM_GadgetUp                                         (TMM_Methods + 14)
  379.      /*                 TMP_GadgetUp    (void)                               */
  380. #define TMM_AppEvent                                         (TMM_Methods + 15)
  381.      /*                 TMP_AppEvent    (void)                               */
  382.  
  383. /* Method parameters */
  384. struct TMP_Activate {
  385.  ULONG  tmpa_MethodID;
  386.  void  *tmpa_Data;
  387. };
  388.  
  389. #define TMV_Attach_Normal sizeof(struct TMMemberData)
  390. struct TMP_Attach {
  391.  ULONG   tmpa_MethodID;
  392.  Object *tmpa_Object;
  393.  ULONG   tmpa_Size;
  394. };
  395.  
  396. struct TMP_Detach {
  397.  ULONG                tmpd_MethodID;
  398.  struct TMMemberData *tmpd_MemberData;
  399. };
  400.  
  401. struct TMP_ParseIFF {
  402.  ULONG             tmppi_MethodID;
  403.  struct IFFHandle *tmppi_IFFHandle;
  404. };
  405.  
  406. struct TMP_ParseTags {
  407.  ULONG           tmppt_MethodID;
  408.  struct TagItem *tmppt_Tags;
  409. };
  410.  
  411. struct TMP_GetImage {
  412.  ULONG          tmpgi_MethodID;
  413.  Object        *tmpgi_Object;
  414.  struct Screen *tmpgi_Screen;
  415. };
  416.  
  417. struct TMP_IDCMPEvent {
  418.  ULONG                tmpie_MethodID;
  419.  struct IntuiMessage *tmpie_Message;
  420. };
  421.  
  422. struct TMP_ScreenOpen {
  423.  ULONG       tmpso_MethodID;
  424.  const char *tmpso_Name;
  425. };
  426.  
  427. struct TMP_ScreenClose {
  428.  ULONG          tmpsc_MethodID;
  429.  struct Screen *tmpsc_Screen;
  430. };
  431.  
  432. struct TMP_Layout {
  433.  ULONG tmpl_MethodID;
  434.  ULONG tmpl_Columns;
  435. };
  436.  
  437. struct TMP_GadgetUp {
  438.  ULONG tmpgu_MethodID;
  439.  ULONG tmpgu_GadgetID;
  440. };
  441.  
  442. struct TMP_AppEvent {
  443.  ULONG              tmpae_MethodID;
  444.  struct AppMessage *tmpae_Message;
  445. };
  446.  
  447. /* Method attributes */
  448. /* i = Can be supplied in OM_NEW    */
  449. /* I = MUST be supplied in OM_NEW   */
  450. /* s = Can be changed with OM_SET   */
  451. /* g = Can be requested with OM_GET */
  452.  
  453. #define TMA_BASE (TAG_USER + 0x10000)
  454.  
  455. /* Global attributes */                      /* XXX (Type)                   */
  456. #define TMA_GLOBAL     (TMA_BASE   + 0x0000)
  457. #define TMA_TMHandle   (TMA_GLOBAL +      1) /* I.g (struct TMHandle *)      */
  458. #define TMA_ObjectType (TMA_GLOBAL +      2) /* I.. (ULONG)                  */
  459. #define TMA_ObjectName (TMA_GLOBAL +      3) /* .sg (const char *)           */
  460. #define TMA_ObjectID   (TMA_GLOBAL +      4) /* ..g (ULONG)                  */
  461.  
  462. /* Group class attributes */
  463. #define TMA_GROUP      (TMA_BASE   + 0x1000)
  464.  
  465. /* Button class attributes */
  466. #define TMA_BUTTON     (TMA_BASE   + 0x2000)
  467. #define TMA_Entry      (TMA_BUTTON +      1) /* I.. (struct DockEntryChunk *)*/
  468. #define TMA_Screen     (TMA_BUTTON +      2) /* I.. (struct Screen *)        */
  469. #define TMA_Font       (TMA_BUTTON +      3) /* i.. (struct TextFont *)      */
  470. #define TMA_Images     (TMA_BUTTON +      4) /* i.. (BOOL)                   */
  471. #define TMA_Text       (TMA_BUTTON +      5) /* i.. (BOOL)                   */
  472.  
  473. /* Entry class attributes */
  474. #define TMA_ENTRY      (TMA_BASE   + 0x4000)
  475. #define TMA_String     (TMA_ENTRY  +      1) /* i.. (const char *)           */
  476. #define TMA_Image      (TMA_ENTRY  +      2) /* i.. (Object *)               */
  477.